package com.victualler.core.base.repository;

import com.victualler.core.base.dao.BaseDao;
import com.victualler.core.common.dto.PageDto;

import javax.persistence.EntityManager;
import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * @Aouthor Guoshichang
 * @Date 9:34 on 2018/6/27.
 * @Function 封装用于复杂sql查询的API. 为每个实体的repository层提供便利操作
 */
public interface IBaseQueryRepository<T extends BaseDao,ID extends Serializable> {
    /**
     * @author Guoshichang   
     * @date 11:20 on 2018/6/27.
     * @function 获取entityManager
     */
    public EntityManager getEntityManager();

    /**
     * @author Guoshichang
     * @date 10:42 on 2018/6/27.
     * @param sql 原生sql语句
     * @param params 参数
     * @function 根据sql 查询list结果
     */
    public List<T> queryListBySql(String sql, Object[] params);

    /**
     * @author Guoshichang
     * @date 10:42 on 2018/6/27.
     * @param sql 原生sql语句
     * @param params 参数
     * @function 根据sql 查询list结果
     */
    public List<T> queryListBySql(String sql,Map<String,Object> params);

    /**
     * @author Guoshichang
     * @date 10:42 on 2018/6/27.
     * @param requestDto 注解配置的查询对象 -- 要求 查询的结果集sql配置为实体类类名
     * @function 根据requestDto 查询list结果
     */
    public List<T> queryListByRequestDto(Object requestDto);

    /**
     * @author Guoshichang
     * @date 10:42 on 2018/6/27.
     * @param requestDto 注解配置的查询对象
     * @param responseClass 返回参数类型
     * @function 根据requestDto 和自定义的查询结果集获取结果 查询list结果
     */
    public <S>List<S> queryListByRequestDto(Object requestDto , Class<S> responseClass);

    /**
     * @author Guoshichang
     * @date 10:42 on 2018/6/27.
     * @param requestDto 注解配置的查询对象
     * @param responseClass 返回参数类型
     * @function 根据requestDto 和自定义的查询结果集获取结果 查询list结果
     */
    public <S>PageDto<S> queryPageByRequestDto(Object requestDto , Class<S> responseClass,int pageNo,int limit);

    /**
     * @author Guoshichang
     * @date 10:42 on 2018/6/27.
     * @param requestDto
     * @function 根据requestDto查询 PageDto结果
     */
    public PageDto<T> queryEOPageByRequestDto(Object requestDto,int pageNo,int limit);

    /**
     * @author Guoshichang
     * @date 10:42 on 2018/6/27.
     * @param sql 原生sql语句
     * @param params 参数
     * @function 根据sql PageDto结果
     */
    public PageDto<T> queryPageBySql(String sql, Object[] params,int pageNo,int limit);

    /**
     * @author Guoshichang
     * @date 10:42 on 2018/6/27.
     * @param sql 原生sql语句
     * @param params 参数
     * @function 根据sql PageDto结果
     */
    public <S>PageDto<S> queryPageBySql(String sql, Object[] params,Class<S> responseClass, int pageNo, int limit);


    /**
     * @author Guoshichang
     * @date 10:42 on 2018/6/27.
     * @param sql 原生sql语句
     * @param params 参数
     * @function 根据sql PageDto结果
     */
    public <S>PageDto<S> queryPageBySql(String sql, Map<String,Object> params,Class<S> responseClass, int pageNo, int limit);

    /**
     * @author Guoshichang
     * @date 10:42 on 2018/6/27.
     * @param sql 原生sql语句
     * @param params 参数
     * @function 根据sql count结果
     */
    public long queryCountBySql(String sql, Object[] params);
    /**
     * @author Guoshichang
     * @date 10:42 on 2018/6/27.
     * @param requestDto 注解配置的查询对象
     * @function 根据sql count结果
     */
    public long queryCountByRequestDto(Object requestDto);


    /**
     * @author Guoshichang   
     * @date 11:22 on 2018/6/27.
     * @param entityClass
     * @function 获取某个实体类的表名
     */
    public String  getTableName(Class<? extends BaseDao> entityClass);

    /**
     * @author Guoshichang
     * @date 15:31 on 2018/6/27.
     * @function 获取实例类
     */
    public Class<T> getEntityClass();

}
